package junit.tests.extensions;

import junit.framework.*;
import junit.extensions.*;

public class ExceptionTestCaseTest extends junit.framework.TestCase {

  static public class ThrowExceptionTestCase extends ExceptionTestCase {

    public ThrowExceptionTestCase(String name, Class exception) {
      super(name, exception);
    }

    public void test() {
      throw new IndexOutOfBoundsException();
    }
  }

  static public class ThrowRuntimeExceptionTestCase extends ExceptionTestCase {

    public ThrowRuntimeExceptionTestCase(String name, Class exception) {
      super(name, exception);
    }

    public void test() {
      throw new RuntimeException();
    }
  }

  static public class ThrowNoExceptionTestCase extends ExceptionTestCase {

    public ThrowNoExceptionTestCase(String name, Class exception) {
      super(name, exception);
    }

    public void test() {
    }
  }

  public void testExceptionSubclass() {
    ExceptionTestCase test = new ThrowExceptionTestCase("test", IndexOutOfBoundsException.class);
    TestResult result = test.run();
    assertEquals(1, result.runCount());
    assertTrue(result.wasSuccessful());
  }

  public void testExceptionTest() {
    ExceptionTestCase test = new ThrowExceptionTestCase("test", IndexOutOfBoundsException.class);
    TestResult result = test.run();
    assertEquals(1, result.runCount());
    assertTrue(result.wasSuccessful());
  }

  public void testFailure() {
    ExceptionTestCase test = new ThrowRuntimeExceptionTestCase("test",
        IndexOutOfBoundsException.class);
    TestResult result = test.run();
    assertEquals(1, result.runCount());
    assertEquals(1, result.errorCount());
  }

  public void testNoException() {
    ExceptionTestCase test = new ThrowNoExceptionTestCase("test", Exception.class);
    TestResult result = test.run();
    assertEquals(1, result.runCount());
    assertEquals(1, result.failureCount());
  }

  public void testWrongException() {
    ExceptionTestCase test = new ThrowRuntimeExceptionTestCase("test",
        IndexOutOfBoundsException.class);
    TestResult result = test.run();
    assertEquals(1, result.runCount());
    assertEquals(1, result.errorCount());
  }
}